/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package sisvoto.Utiles;

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.StringTokenizer;

/*
 * @author DIANA
 */
public class Util {

    /**
     * Numero de Provincias del Ecuador
     */
    public static final int NUMERO_DE_PROVINCIAS = 24;//22;

    /**
     * Este método permite verificar si una cédula de identidad es verdadera
     * retorna true si es válida, caso contrario retorna false.
     * @param cedula Cédula de Identidad Ecuatoriana de 10 digitos.
     * @return Si es verdadera true, si es falsa false
     */
    public boolean esCedulaValida(String cedula) {
        //verifica que tenga 10 dígitos y que contenga solo valores numéricos
        if (!((cedula.length() == 10) && cedula.matches("^[0-9]{10}$"))) {
            return false;
        }

        //verifica que los dos primeros dígitos correspondan a un valor entre 1 y NUMERO_DE_PROVINCIAS
        int prov = Integer.parseInt(cedula.substring(0, 2));

        if (!((prov > 0) && (prov <= NUMERO_DE_PROVINCIAS))) {
            return false;
        }

        //verifica que el último dígito de la cédula sea válido
        int[] d = new int[10];

        //Asignamos el string a un array
        for (int i = 0; i < d.length; i++) {
            d[i] = Integer.parseInt(cedula.charAt(i) + "");
        }

        int imp = 0;
        int par = 0;

        //sumamos los duplos de posición impar
        for (int i = 0; i < d.length; i += 2) {
            d[i] = ((d[i] * 2) > 9) ? ((d[i] * 2) - 9) : (d[i] * 2);
            imp += d[i];
        }

        //sumamos los digitos de posición par
        for (int i = 1; i < (d.length - 1); i += 2) {
            par += d[i];
        }

        //Sumamos los dos resultados
        int suma = imp + par;

        //Restamos de la decena superior
        int d10 = Integer.parseInt(String.valueOf(suma + 10).substring(0, 1)
                + "0") - suma;

        //Si es diez el décimo dígito es cero
        d10 = (d10 == 10) ? 0 : d10;

        //si el décimo dígito calculado es igual al digitado la cédula es correcta
        return d10 == d[9];
    }

    public String parcialNumero(double pt) {
        try {
            DecimalFormat form;
            form = new DecimalFormat("##.00");
            String t = form.parse(form.format(pt)).toString();
            return t;
        } catch (Exception he) {
            return String.valueOf(Double.NaN);
        }
    }

    public Date fijarFecha() {

        Calendar c1 = Calendar.getInstance();

        String dia = Integer.toString(c1.get(Calendar.DATE));
        String mes = Integer.toString(c1.get(Calendar.MONTH));
        String year = Integer.toString(c1.get(Calendar.YEAR));
        String hora = Integer.toString(c1.get(Calendar.HOUR));
        String min = Integer.toString(c1.get(Calendar.MINUTE));
        System.out.println(mes);
        Date fecha = new Date(Integer.parseInt(year) - 1900, Integer.parseInt(mes), Integer.parseInt(dia), Integer.parseInt(hora), Integer.parseInt(min));
        // Date fecha=new Date(Integer.parseInt(year)-1900,Integer.parseInt(mes),Integer.parseInt(dia));
        return fecha;
    }

    public String formatoFecha(Date fecha) {
//        System.out.println("f: "+fecha.toString());
        String patter = "yyyy-MM-dd";
        SimpleDateFormat formato = new SimpleDateFormat(patter);
        return formato.format(fecha);
    }
    
    public String formatDATE(Date fecha) {
//        System.out.println("f: "+fecha.toString());
        String patter = "yyyy-MM-dd HH:mm:ss.SSS";
        SimpleDateFormat formato = new SimpleDateFormat(patter);
        return formato.format(fecha);

    }

    public String formatoFormal(Date fecha) {

        String dia = "";
        switch (fecha.getDay()) {
            case 1:
                dia = "Lunes";
                break;
            case 2:
                dia = "Martes";
                break;
            case 3:
                dia = "Miércoles";
                break;
            case 4:
                dia = "Jueves";
                break;
            case 5:
                dia = "Viernes";
                break;
            case 6:
                dia = "Sabado";
                break;
            case 0:
                dia = "Domingo";
                break;
        }

        String mes = "";
        switch (fecha.getMonth()) {
            case 0:
                mes = "Enero";
                break;
            case 1:
                mes = "Febrero";
                break;
            case 2:
                mes = "Marzo";
                break;
            case 3:
                mes = "Abril";
                break;
            case 4:
                mes = "Mayo";
                break;
            case 5:
                mes = "Junio";
                break;
            case 6:
                mes = "Julio";
                break;
            case 7:
                mes = "Agosto";
                break;
            case 8:
                mes = "Septiembre";
                break;
            case 9:
                mes = "Octubre";
                break;
            case 10:
                mes = "Noviembre";
                break;
            case 11:
                mes = "Diciembre";
                break;
        }

        String anio = String.valueOf(fecha.getYear() + 1900);

        return dia + ", " + fecha.getDate() + " de " + mes + " de " + anio;
    }

    public double redondear(double numero, int decimales) {
        return Math.round(numero * Math.pow(10, decimales)) / Math.pow(10, decimales);
    }

    public boolean validarFechas(Date fMenor, Date fMayor) {
        boolean ban = false;
        if (fMayor.getYear() >= fMenor.getYear()) {
            if (fMayor.getYear() == fMenor.getYear()) {
                if (fMayor.getMonth() >= fMenor.getMonth()) {
                    if (fMayor.getMonth() == fMenor.getMonth()) {
                        // if (fMayor.getDay() > fMenor.getDay()) {
                        if (fMayor.getDate() > fMenor.getDate()) {
                            //esta Correcto
                            ban = false;
                        } else {
                            ban = true;
                        }
                    }
                } else {
                    ban = true;
                }
            }
        } else {
            ban = true;
        }
        return ban;
    }

    public boolean validarFechasIguales(Date fech1, Date fech2) {

        int anio1 = fech1.getYear();
        int mes1 = fech1.getMonth();
        int dia1 = fech1.getDate();

        int anio2 = fech2.getYear();
        int mes2 = fech2.getMonth();
        int dia2 = fech2.getDate();

        if (anio1 == anio2 && mes1 == mes2 && dia1 == dia2) {
            return true;
        } else {
            return false;
        }
    }

    public boolean sonHorasiguales(Date f1, Date f2){
        int hora1 = f1.getHours();
        int min1 = f1.getMinutes();
        int hora2 = f2.getHours();
        int min2 = f2.getMinutes();

        if(hora1==hora2){
            if(min1==min2)            {
                return true;
            }else{
                return false;
            }
        }else{
            return false;
        }
    }
    
    public boolean validarHoras(Date hMenor, Date hMayor) { //verifica si una hora es mayor que otra

        //resultados
        //horas iguales =true, mayor>menor =false, mayor<menor=true;

        boolean ban = false;
        if (hMayor.getHours() >= hMenor.getHours()) {
            if (hMayor.getHours() == hMenor.getHours()) {
                if (hMayor.getMinutes() > hMenor.getMinutes()) {
                    //correcto
                    ban = false;
                } else {
                    ban = true;
                }
            }
        } else {
            ban = true;
        }
        return ban;
    }

    public boolean fecha1EsMayorqueF2(Date f1, Date f2) {
        boolean bandera = false;
        if (f1.getYear() > f2.getYear()) {
            bandera = true;
        } else {
            if (f1.getMonth() >= f2.getMonth()) {

                if (f1.getDate() > f2.getDate()) {
                    bandera = true;
                } else {
                    bandera = false;
                }
            } else {
                bandera = false;
            }
        }
        return bandera;
    }

    public List<Date> generadorFechas(Date fechainicio, Date fechafinal) {

        List<Date> listaDias = new ArrayList<Date>();

        if (validarFechasIguales(fechainicio, fechafinal)) {
            if (fechainicio.getDay() == 0) {
                return null;
            } else {

                listaDias.add(fechainicio);
                return listaDias;
            }
        } else {

            System.out.println("Fechas desiguales --> entra");

            if (fecha1EsMayorqueF2(fechafinal, fechainicio)) {

                Date fechaGenerada = null;
                //generacion de fechas en un intervalo inicio y final de lunes a sabado             

                for (int i = 0; i != -1; i++) {
                    if (i == 0) {
                        if (fechainicio.getDay() != 0) {
                            listaDias.add(fechainicio);
                            fechaGenerada = DateUtiles.getNextDay(fechainicio);
                        } else {
                            fechaGenerada = DateUtiles.getNextDay(fechainicio);
                        }
                    } else {
                        if (validarFechasIguales(fechafinal, fechaGenerada)) {
                            if (fechafinal.getDay() == 0) {
                                break;
                            } else {
                                listaDias.add(fechafinal);
                                break;
                            }
                        } else {
                            if (fechaGenerada.getDay() != 0) {
                                listaDias.add(fechaGenerada);
                                fechaGenerada = DateUtiles.getNextDay(fechaGenerada);
                            } else {
                                fechaGenerada = DateUtiles.getNextDay(fechaGenerada);
                            }
                        }
                    }

                }

                return listaDias;
            } else {
                return null;
            }
        }
    }

    //calcula la diferencia entre horas
    public Date calcularHora(Date horaGeneradaSistema, Date horaRegistrada) {

        Date aux = new Date();


        if (validarHoras(horaRegistrada, horaGeneradaSistema) == false) {
            aux.setHours(horaGeneradaSistema.getHours() - horaRegistrada.getHours());
            aux.setMinutes(horaGeneradaSistema.getMinutes() - horaRegistrada.getMinutes());
            System.out.println("&&&&&&&&&&&&& antes");
            return aux;
        } else {
            if (validarHoras(horaGeneradaSistema, horaRegistrada) == false) {
                horaRegistrada.setMinutes(horaRegistrada.getMinutes() - 10);
                if (validarHoras(horaRegistrada, horaGeneradaSistema) == false) {
                    //tiene retraso hasta de 10 minutos pero pasa normal
                    horaRegistrada.setMinutes(horaRegistrada.getMinutes() + 10);
                    aux.setHours(0);
                    aux.setMinutes(0);
                    System.out.println("&&&&&&&&&&&&& dentro del rango con 10");
                    return aux;

                } else {
                    //tiene retraso
                    horaRegistrada.setMinutes(horaRegistrada.getMinutes() + 10);
                    aux.setHours(horaRegistrada.getHours() - horaGeneradaSistema.getHours());
                    aux.setMinutes(horaRegistrada.getMinutes()-horaGeneradaSistema.getMinutes());
                    System.out.println("&&&&&&&&&&&&& atrasada");
                    return aux;
                }
            } else {
                aux.setHours(0);
                aux.setMinutes(0);
                System.out.println("&&&&&&&&&&&&& puntual");
                return aux;
            }
        }
    }

   /* public static void main(String[] args) {

        Date hgs = new Date();
        Date hr = new Date();

        hgs.setHours(13);
        hgs.setMinutes(59 + 10);



//        Date d= new Util().calcularHora(, null);
        System.out.println(hgs.getHours() + ":" + hgs.getMinutes());
    }*/
}
